﻿#pragma once
#include<locale.h>
#include<stdio.h>
#include<windows.h>
#include<stdbool.h>
#include<stdlib.h>
#include<time.h>
#define BODY L'●'
#define FOOD L'★'
#define WALL L'■'
#define POS_x 24
#define POS_y 5
#define KEY_PRESS(vk)  ((GetAsyncKeyState(vk)&1)?1:0)
#define FoodNum 4
//蛇的节点：
typedef struct SnakeNode
{
	int x;//每个蛇的节点的坐标，要根据该坐标打印蛇的图案
	int y;
	struct SnakeNode* next;
}SnakeNode;

//贪吃蛇的蛇头方向：
enum DIRECTION
{
	UP = 1,
	DOWN,
	LEFT,
	RIGHT   //最后一个数据后无标点符号
};

//贪吃蛇的状态
enum CONDITION
{
	NORMAL = 1, //正常进行
	KILL_BY_WALL,//撞到墙壁
	KILL_BY_SELF,//撞到自己
	END_NORMAL//正常退出
};

//贪吃蛇游戏: （存放与贪吃蛇游戏相关的元素）
typedef struct SnakeGame
{
	SnakeNode* SnakeHead;//蛇的头结点

	SnakeNode* Food;   //食物，本质也是一个结构体，所以可以用SnakeNode结构体定义
	//因为，蛇吃了食物后要将该食物连接到蛇上，所以用蛇的结构体定义食物比较方便

	SnakeNode* bomb;
	enum DIRECTION dir;//蛇的方向，有上下左右方向，所以用枚举类型

	enum CONDITION condition;//游戏的状态，有蛇死亡，暂停，退出等状态，所以用枚举类型

	int Food_score; //食物的分数
	int Score;  //成绩

	int Speed; //蛇的速度，其实是程序休眠的时间，以毫秒为单位，休眠时间越短，速度越快，休眠时间越长，速度越慢
	//如，当程序运行到Sleep(int num)函数时,程序要暂停num毫秒后才继续运行
}SnakeGame;

void Set_Pos(short x, short y);
void InitSnakeGame(SnakeGame* Snake);
void InitSnake(SnakeGame* Snake);
void CreateFood(SnakeGame* Snake);
void GameRun(SnakeGame* Snake);
void SnakeMove(SnakeGame* Snake);
void GameEnd(SnakeGame* Snake);
void FoodMove(SnakeGame* Snake);


